package ve.com.wayoyo.wuml_case.DibujoDiagramas;

import java.util.ArrayList;

import ve.com.wayoyo.wuml_case.R;
import ve.com.wayoyo.wuml_case.UserPref;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class ModificarMetodoComponente extends Dialog {

	private int _position;
	private boolean met_final;
	private boolean met_static;
	private boolean atr_final;
	private String alcance;
	private LinearLayout _metodo;
	private LinearLayout _layoutIn;
	private LinearLayout _layoutTemp;	
	private CompMetodo _metodoSelect;
	//	private Spinner _alcanceMetodo;
	private EditText _nombreMetodo;
	private EditText _retornoMetodo;
	private EditText _nombreVariable;
	private EditText _tipoDatoEntrada;
	private EditText _nombreVariableLista;
	private EditText _tipoDatoLista;
	private CheckBox cb_final;
	private boolean met_abstract;
	private TextView text;
	private ArrayList<CompVariable> _listaAtributosEntrada= new ArrayList<CompVariable>();
	private ArrayList<View> _listaAtributosEntradaFinal = new ArrayList<View>();
	private String _tipoComponente;

	public ModificarMetodoComponente(Context context,int position, String tipoComponente) {
		super(context);		
		this._position = position;
		this._tipoComponente=tipoComponente;
	}

	public void alert(String mensaje) {
		Toast.makeText(this.getContext(), mensaje, Toast.LENGTH_SHORT).show();
	}

	@SuppressWarnings("unchecked")
	@Override
	public void onCreate(Bundle savedInstanceState) {	
		super.onCreate(savedInstanceState);
		setContentView(R.layout.metodo_componente_layout);
		setTitle("Modificar Metodo");
		int pageWidth = UserPref.getInstancia().getWinWidth();
		int pageHeight = UserPref.getInstancia().getWinHeight();
		LayoutParams params = getWindow().getAttributes();
		if (pageWidth<750){
			params.width = pageWidth;
			params.height = pageHeight;
		}else{
			params.width = 750;
			params.height = 400;   
		}		     
		getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);


		_metodo = (LinearLayout)findViewById(R.id.metodosLayout);
		_metodo.removeAllViewsInLayout();
		_metodo.setOrientation(LinearLayout.VERTICAL);
		_layoutIn = new LinearLayout(getContext());
		_layoutIn.setOrientation(LinearLayout.VERTICAL);
		if (_tipoComponente.equals("Clase"))
			_metodoSelect = ((CompClase)VistaDiagrama.getVista().getDiagrama().getSelectedItem()).getMetodoIndex(this._position);
		else if (_tipoComponente.equals("Interface"))
			_metodoSelect = ((CompInterface)VistaDiagrama.getVista().getDiagrama().getSelectedItem()).getMetodoIndex(this._position);
		else if (_tipoComponente.equals("Abstract"))
			_metodoSelect = ((CompAbstract)VistaDiagrama.getVista().getDiagrama().getSelectedItem()).getMetodoIndex(this._position);
		_listaAtributosEntrada = (ArrayList<CompVariable>) _metodoSelect.getVariablesEntrada().clone();
		this.setNombreMetodo();
		this.setAlcanceMetodo();		
		this.setVariableRetorno();
		this.setVariablesEntrada();
		_metodo.addView(_layoutIn);
		this.setBotonGuardar();
	}

	private void setAlcanceMetodo() {
		_layoutTemp = new LinearLayout(getContext());
		text  = new TextView(getContext());
		text.setText("Modificadores");
		text.setTextSize(20);
		_layoutTemp.addView(text);	
		_metodo.addView(_layoutTemp);
		this.setModificadoresMetodos();		
	}

	private void setModificadoresMetodos() {
		_layoutTemp = new LinearLayout(getContext());
		final CheckBox cb_final = new CheckBox(getContext());
		cb_final.setText("final");
		met_final = _metodoSelect.isFinal();
		cb_final.setChecked(met_final);
		final CheckBox cb_static = new CheckBox(getContext());
		cb_static.setText("static");
		met_static = _metodoSelect.isStatic();
		cb_static.setChecked(met_static);
		final CheckBox cb_abstract = new CheckBox(getContext());		
		cb_abstract.setText("abstract");
		met_abstract = _metodoSelect.isAbstract();
		cb_abstract.setChecked(met_abstract);
		if (!_tipoComponente.equals("Abstract")){
			cb_abstract.setTextColor(Color.GRAY);
			cb_abstract.setClickable(false);
		}
		if (_tipoComponente.equals("Interface")){
			cb_final.setTextColor(Color.GRAY);
			cb_final.setClickable(false);
			cb_static.setTextColor(Color.GRAY);
			cb_static.setClickable(false);
		}
		cb_final.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				if (isChecked) {
					met_final = true;
					met_abstract = false;
					cb_abstract.setChecked(false);
				}
				else {
					met_final = false;
				}
			}
		});

		cb_static.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				if (isChecked) {
					met_static = true;
				}
				else {
					met_static = false;
				}
			}
		});	
		
		cb_abstract.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				if (isChecked) {
					met_abstract = true;
					met_final = false;
					cb_final.setChecked(false);
				}
				else {
					met_abstract = false;
				}
			}
		});	

		RadioGroup rg_alcance = new RadioGroup(getContext());
		rg_alcance.setOrientation(RadioGroup.HORIZONTAL);
		RadioButton rb_public = new RadioButton(getContext());
		rb_public.setId(R.id.radio_button_public);
		rb_public.setText("Public");
		RadioButton rb_private = new RadioButton(getContext());
		rb_private.setId(R.id.radio_button_private);
		rb_private.setText("Private");
		RadioButton rb_protected = new RadioButton(getContext());
		rb_protected.setId(R.id.radio_button_protected);
		rb_protected.setText("Protected");
		RadioButton rb_default = new RadioButton(getContext());
		rb_default.setText("Default");		
		rg_alcance.addView(rb_default);
		rg_alcance.addView(rb_public);
		rg_alcance.addView(rb_private);
		rg_alcance.addView(rb_protected);

		if (_metodoSelect.getNivelAcceso().equals("public")){
			rb_public.setChecked(true);
			alcance = "public";
		}else if(_metodoSelect.getNivelAcceso().equals("private")){
			rb_private.setChecked(true);
			alcance = "private";
		}else if(_metodoSelect.getNivelAcceso().equals("protected")){
			rb_protected.setChecked(true);
			alcance = "protected";
		}else{
			rb_default.setChecked(true);
			alcance = "default";
		}		
		rg_alcance.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				if (checkedId == R.id.radio_button_public)
					alcance = "public";
				else if (checkedId == R.id.radio_button_private)
					alcance = "private";
				else if (checkedId == R.id.radio_button_protected)
					alcance = "protected";
				else
					alcance = "default";
			}
		});
		_metodo.addView(rg_alcance);
		_layoutTemp.addView(cb_final);
		_layoutTemp.addView(cb_static);	
		_layoutTemp.addView(cb_abstract);
		_metodo.addView(_layoutTemp);
	}

	private void setNombreMetodo(){
		_layoutTemp = new LinearLayout(getContext());
		text = new TextView(getContext());
		text.setText("Nombre");		
		_layoutTemp.addView(text);
		this.setNombreMetodoEdit();
		_metodo.addView(_layoutTemp);
	}

	private void setNombreMetodoEdit(){
		_nombreMetodo = new EditText(getContext());
		_nombreMetodo.setHint("Nombre del Metodo");
		_nombreMetodo.setMinimumWidth(150);
		_nombreMetodo.setText(_metodoSelect.getNombreMetodo());
		_layoutTemp.addView(_nombreMetodo);
	}

	private void setVariableRetorno(){
		_layoutTemp = new LinearLayout(getContext());
		text = new TextView(getContext());
		text.setText("Variable de Retorno");
		text.setTextSize(16);
		_layoutTemp.addView(text);		
		this.setVariableRetornoEdit();
		_metodo.addView(_layoutTemp);
	}

	private void setVariableRetornoEdit(){
		_retornoMetodo = new EditText(getContext());		
		_retornoMetodo.setMinimumWidth(150);	
		_retornoMetodo.setText(_metodoSelect.getTipoDato());
		_layoutTemp.addView(_retornoMetodo);
	}

	private void setVariablesEntrada(){
		text = new TextView(getContext());
		text.setText("Variables de Entrada");
		text.setTextSize(20);
		_metodo.addView(text);
		this.setEditVariablesEntrada();
		_metodo.addView(_layoutTemp);
		this.setVariablesEntradaAnteriores();
	}

	private void setEditVariablesEntrada(){
		_layoutTemp = new LinearLayout(getContext());

		text = new TextView(getContext());
		text.setText("Nombre Atributo");
		text.setTextSize(16);
		_layoutTemp.addView(text);

		this.setNombreVariableEntrada();

		text = new TextView(getContext());
		text.setText("Tipo de Dato");
		text.setTextSize(16);
		_layoutTemp.addView(text);

		this.setTipoDatoEntrada();

		this.setfinal();

		Button buttonOK = new Button(getContext());
		buttonOK.setText("Agregar");
		buttonOK.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {				
				String nombreVariabletexto = _nombreVariable.getText().toString();
				String tipoDatotexto = _tipoDatoEntrada.getText().toString();
				if ((nombreVariabletexto.equals(""))||(tipoDatotexto.equals(""))){
					_tipoDatoEntrada.setText("");
					_nombreVariable.setText("");
					cb_final.setChecked(false);
					_tipoDatoEntrada.setHint("Int");
					_nombreVariable.setHint("Nombre del Atributo");
					alert("Debe indicar el nombre de variable y el tipo de dato");
				}else{
					CompVariable variable = new CompVariable(nombreVariabletexto,tipoDatotexto);
					variable.setFinal(atr_final);
					_listaAtributosEntrada.add(variable);
					_tipoDatoEntrada.setText("");
					_nombreVariable.setText("");
					cb_final.setChecked(false);
					ModificarMetodoComponente.this.listaVariablesEntrada(variable);
				}					
			}
		});
		_layoutTemp.addView(buttonOK);
	}

	private void setfinal() {
		cb_final = new CheckBox(this.getContext());        
		cb_final.setText("final");		
		cb_final.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				if (isChecked) {
					atr_final = true;
				}
				else {
					atr_final = false;
				}
			}
		});
		_layoutTemp.addView(cb_final);

	}

	private void setVariablesEntradaAnteriores() {
		for (CompVariable variable : _listaAtributosEntrada) {
			_layoutTemp = new LinearLayout(getContext());		

			TextView nombreAtributo = new TextView(getContext());
			nombreAtributo.setText("Nombre Atributo: ");
			_layoutTemp.addView(nombreAtributo);
			this.setNombreVariableLista(variable);

			TextView tipoDatoText = new TextView(getContext());
			tipoDatoText.setText("Tipo de Dato: ");
			_layoutTemp.addView(tipoDatoText);
			this.setTipoDatoEditLista(variable);
			this.setFinalLista(variable);
			this.setBotonEliminar(variable);
			_layoutIn.addView(_layoutTemp);			
		}		
	}	

	private void setBotonEliminar(final CompVariable variable){
		Button buttonOK = new Button(getContext());
		buttonOK.setText("Eliminar");
		buttonOK.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				guardarActualizacion();
				for (CompVariable variableTemp : _listaAtributosEntrada) {
					if ((variableTemp.getNombre().equals(variable.getNombre()))&&(variableTemp.getTipoDato().equals(variable.getTipoDato()))){
						_listaAtributosEntrada.remove(variableTemp);
						if (_tipoComponente.equals("Clase"))
							((CompClase)VistaDiagrama.getVista().getDiagrama().getSelectedItem()).calculoLongitud();
						else if (_tipoComponente.equals("Interface"))
							((CompInterface)VistaDiagrama.getVista().getDiagrama().getSelectedItem()).calculoLongitud();
						else if (_tipoComponente.equals("Abstract"))
							((CompAbstract)VistaDiagrama.getVista().getDiagrama().getSelectedItem()).calculoLongitud();
						break;
					}
				}
				ModificarMetodoComponente.this.dismiss();
			}
		});
		_layoutTemp.addView(buttonOK);
	}

	private void setNombreVariableEntrada() {
		_nombreVariable = new EditText(getContext());		
		_nombreVariable.setHint("Nombre del Atributo");		
		_layoutTemp.addView(_nombreVariable);	
	}

	private void setTipoDatoEntrada() {
		_tipoDatoEntrada = new EditText(getContext());
		_tipoDatoEntrada.setHint("Int");
		_tipoDatoEntrada.setMinimumWidth(150);
		_layoutTemp.addView(_tipoDatoEntrada);
	}

	protected void listaVariablesEntrada(CompVariable variable) {
		_layoutTemp = new LinearLayout(getContext());		

		TextView nombreAtributo = new TextView(getContext());
		nombreAtributo.setText("Nombre Atributo: ");
		_layoutTemp.addView(nombreAtributo);

		this.setNombreVariableLista(variable);

		TextView tipoDatoText = new TextView(getContext());
		tipoDatoText.setText("Tipo de Dato: ");
		_layoutTemp.addView(tipoDatoText);
		this.setTipoDatoEditLista(variable);
		this.setFinalLista(variable);
		this.setBotonEliminar(variable);
		_layoutIn.addView(_layoutTemp);

	}

	private void setFinalLista(CompVariable variable) {
		CheckBox cb_final = new CheckBox(this.getContext());        
		cb_final.setText("final");
		cb_final.setChecked(variable.isFinal());
		_listaAtributosEntradaFinal.add(cb_final);
		_layoutTemp.addView(cb_final);
	}

	private void setNombreVariableLista(CompVariable variable) {
		_nombreVariableLista = new EditText(getContext());
		_nombreVariableLista.setText(variable.getNombre());		
		_nombreVariableLista.setMinimumWidth(100);
		_listaAtributosEntradaFinal.add(_nombreVariableLista);
		_layoutTemp.addView(_nombreVariableLista);
	}

	private void setTipoDatoEditLista(CompVariable variable) {
		_tipoDatoLista = new EditText(getContext());
		_tipoDatoLista.setText(variable.getTipoDato());
		_tipoDatoLista.setMinimumWidth(100);
		_listaAtributosEntradaFinal.add(_tipoDatoLista);
		_layoutTemp.addView(_tipoDatoLista);	
	}

	private void setBotonGuardar(){
		_layoutTemp = new LinearLayout(getContext());
		Button buttonOK = new Button(getContext());
		buttonOK.setText("Guardar");
		LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		buttonOK.setLayoutParams(params );
		buttonOK.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				guardarActualizacion();
			}
		});
		_layoutTemp.addView(buttonOK);
		_metodo.addView(_layoutTemp);
	}

	private boolean getListaActualizada(){
		_listaAtributosEntrada= new ArrayList<CompVariable>();
		int flag =0;
		String nombre="";
		String tipoDato=""; 
		for (View element : _listaAtributosEntradaFinal) {
			if (flag == 0){
				nombre = ((EditText)element).getText().toString();
				if (nombre.equals(""))
					return false;
				flag = 1;
			}else if (flag ==1)
			{
				tipoDato = ((EditText)element).getText().toString();
				if (tipoDato.equals(""))
					return false;				
				flag = 2;
			}else if(flag ==2){
				atr_final = ((CheckBox)element).isChecked();
				CompVariable variable = new CompVariable(nombre, tipoDato);
				variable.setFinal(atr_final);
				_listaAtributosEntrada.add(variable);
				flag =0;
			}			
		}		
		return true;
	}

	private void guardarActualizacion(){		
		String nombre = _nombreMetodo.getText().toString();
		String retorno = _retornoMetodo.getText().toString();
		_metodoSelect.setNombreMetodo(nombre);
		_metodoSelect.setTipoDato(retorno);
		_metodoSelect.setNivelAcceso(alcance);
		_metodoSelect.set_isFinal(met_final);
		_metodoSelect.set_isStatic(met_static);
		_metodoSelect.set_isAbstract(met_abstract);
		if (ModificarMetodoComponente.this.getListaActualizada()){
			_metodoSelect.setVariablesEntrada(_listaAtributosEntrada);
			if (_tipoComponente.equals("Clase"))
				((CompClase)VistaDiagrama.getVista().getDiagrama().getSelectedItem()).calculoLongitud();
			else if (_tipoComponente.equals("Interface"))
				((CompInterface)VistaDiagrama.getVista().getDiagrama().getSelectedItem()).calculoLongitud();
			else if (_tipoComponente.equals("Abstract"))
				((CompAbstract)VistaDiagrama.getVista().getDiagrama().getSelectedItem()).calculoLongitud();
			ModificarMetodoComponente.this.dismiss();	
		}else {			
			alert("Los valores de entrada de los atributos deben tener un valor");
		}

	}
}